home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / varia / silo.lha / silo / Resource.c < prev    next >
C/C++ Source or Header  |  1993-08-08  |  2KB  |  106 lines

  1. /* $Author: ecsv38 $ $Date: 90/08/21 14:45:56 $ $Revision: 1.1 $ */
  2. /* (c) S. Manoharan  sam@lfcs.edinburgh.ac.uk */
  3.  
  4. #include "Resource.h"
  5. #include "Sim.h"
  6. #include "SimEventList.h"
  7.  
  8. extern SimEventList eventlist;
  9.  
  10. short
  11. Resource::reserve(Entity *bywho, const int event_type)
  12. {
  13.    resource_used = 1;
  14.  
  15.    if ( bywho == 0 )
  16.       cout << form("** Error: reserve by null entity\n");
  17.  
  18.    bywho->currentEvent(event_type);
  19.    bywho->afterTime = 0;
  20.  
  21.    if ( available > 0 ) {
  22.       --available;
  23.       servedQ.append(bywho);
  24.       return 1;
  25.    }
  26.    else {
  27.       blockedQ.append(bywho);
  28.       return 0;
  29.    }
  30. }
  31.  
  32. short
  33. Resource::preempt(Entity *bywho, const int event_type)
  34. {
  35.    resource_used = 1;
  36.  
  37.    if ( bywho == 0 )
  38.       cout << form("** Error: preempt by null entity\n");
  39.  
  40.    bywho->currentEvent(event_type);
  41.    bywho->afterTime = 0;
  42.  
  43.    if ( available > 0 ) {
  44.       --available;
  45.       servedQ.append(bywho);
  46.       return 1;
  47.    }
  48.    else {
  49.       Entity *minPrioEnt = servedQ.remove(servedQ.min_entity_id());
  50.       if ( minPrioEnt->priority() >= bywho->priority() ) { // no preempt
  51.      blockedQ.append(bywho);
  52.      servedQ.append(minPrioEnt);
  53.      return 0;
  54.       }
  55.       else { // preempt
  56.      servedQ.append(bywho);
  57.      Event *stopped = ::eventlist.remove(minPrioEnt);
  58.      if ( stopped == 0 ) {
  59.         cout << form("** Error: no events for preempted entity\n");
  60.         return 0;
  61.      }
  62.      minPrioEnt->afterTime = stopped->eventTime() - simtime();
  63.      minPrioEnt->currentEvent(stopped->type());
  64.      blockedQ.insert(minPrioEnt);
  65.          return 1;
  66.       }
  67.    }
  68. }
  69.  
  70. void
  71. Resource::release(Entity *const bywho)
  72. {
  73.    Entity *entity;
  74.  
  75.    if ( bywho == 0 )
  76.       cout << form("** Error: release by null entity\n");
  77.  
  78.    if ( debug_level(1) ) {
  79.       cout << form("Releasing resource %s\n", resource_name);
  80.       cout << "\n---Begin{blockedQ}\n";
  81.       blockedQ.print();
  82.       cout << "\n---End{blockedQ}\n";
  83.    }
  84.  
  85.    if ( servedQ.remove(bywho->id()) == 0 )
  86.       cout << form("** Error: release without reserve\n");
  87.  
  88.    if ( ( entity = blockedQ.get() ) != 0 ) {
  89.       Event *event = new Event(entity->currentEvent());
  90.       entity->schedule(entity->afterTime, event);
  91.    }
  92.    ++available;
  93. }
  94.  
  95. void
  96. Resource::set(const int sz)
  97. {
  98.    if ( resource_used ) {
  99.       cout << form("%s: resource already used. cannot set size\n",
  100.      resource_name);
  101.       exit(-1);
  102.    }
  103.    available = sz;
  104. }
  105.  
  106.